from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

#数据库的配置变量
HOSTNAME = '127.0.0.1'
PORT     = '3306'
DATABASE = 'zl_flask'
USERNAME = 'root'
PASSWORD ='1234'
DB_URL   = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = "user"
    # primary_key 主键，autoincrement 自动增长
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(200),nullable=False)

class UserExtension(db.Model):
    __tablename__ = "user_extension"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    school = db.Column(db.String(100))
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))

    """
    父表：被引用方的表
    子表：引用父表的表（表中有父表的字段，一般是父表id，并且定义relationship）

    正向查询：在子表中，查询父表的信息
    反向查询：通过父表，查询子表的信息
    """
    #db.backref
    #1.在反向引用时候，需要传递一些其他参数，那么需要用到这个函数，否则不需要使用，只要在relationship的backref参数上，设置反向引用的名称就可以。
    #2.uselist=False,代表反向引用的时候，不是一个列表，而是一个对象（一对一）。
    user = db.relationship("User",backref=db.backref("extension",uselist=False))

#orm可以看作是一个类
class Article(db.Model):
    __tablename__ = "article"
    #primary_key 主键，autoincrement 自动增长
    id = db.Column(db.Integer, primary_key=True,autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)

    #外键：
    #1.外键的数据类型一定要看所引用的字段的数据类形
    #2.db.ForeignKey("表名.字段名")
    #3.外键是属于数据库层面，不推荐在orm中使用
    author_id = db.Column(db.Integer,db.ForeignKey("user.id"))

    #relationship:
    #1.第一个参数是模型的名字，必须要和模型的名字保持一致
    #2.backref（back reference）代表反向引用 ，代表对方访问我的时候字段的名称
    author = db.relationship("User",backref="articles")

#orm版本管理没有学，现在只能删除所有表，在创建
db.drop_all()
db.create_all()


@app.route("/otm")
def one_to_many():
    #article = Article(title="111",content="xxx")
    article1 = Article(title="001", content="三国")
    article2 = Article(title="002", content="水浒")
    user = User(username="zhiliao")
    #article.author = user
    article1.author = user
    article2.author = user
    db.session.add(article1,article2)
    db.session.commit()

    print(user.articles)
    return "otm数据库操作成功"


@app.route("/oto")
def one_to_one():
    #fist()和[0]可以取出第一条数据
    user = User(username="lihua")
    #user = User.query.filter_by(id = 1).first()
    extension = UserExtension(school="清华大学")
    user.extension = extension
    db.session.add(user)
    db.session.commit()
    return "one to one success"


@app.route("/article")
def article_view():
    # #1添加数据
    # #insert table article values(xx)
    # article = Article(title="钢铁是怎样炼成的",content='xxx')
    # db.session.add(article)
    # #一个提交操作
    # db.session.commit()

    # #2.查询操作
    # #filter_by:返回一个类列表的对象
    # article = Article.query.filter_by(id=1)[0]
    # print(article.title)

    # #3.修改数据
    #     # article = Article.query.filter_by(id=1)[0]
    #     # article.content = "yyy"
    #     # db.session.commit()

    #4.删除数据
    # Article.query.filter_by(id=1).delete()
    # db.session.commit()

    return "数据成功"

@app.route('/')
def hello_world():
    #测试代码是否连接成功
    engine = db.get_engine()
    with engine.connect() as conn:
        result = conn.execute("select 1")
        print(result.fetchone())
    return 'Hello World!'


if __name__ == '__main__':
    app.run()
